如何在 R 中的整个数据帧上使用正则表达式
How to use regex over entire dataframe in R
R 的新用户所以请放轻松。
我有这样的数据框:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
实际文件要大得多并且是从旧硬件输出的。由于某些原因,一些条目前面有 "Z"。如何从整个数据集中删除?
我试过 df = gsub("Z", " ", df)
但它让我胡说八道。这该死的东西!
[1] "1:3" "c(3, 1, 2)" "c(1, 1, 2)" "c(2, 3, 1)"
在 Whosebug 上查看并尝试了 stringr 包,但也无法开始工作。有人知道该怎么办吗?
您可以按以下方式使用简单的 ^Z
正则表达式:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
df[] <- lapply(df, sub, pattern = '^Z', replacement ="")
> df
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
^Z
模式用^
锚点匹配字符串的开头,然后Z
使用sub
匹配和删除(因为只有一种可能在每个字符串中匹配使用 gsub
).
没有意义
你很接近。如果你想使用 base gsub
data$Mineral = gsub("Z", "", data$Mineral)
您可以对所有列执行此操作。或者结合使用 apply
策略(参见其他答案!)
PS。将数据命名为 data
不是一个好主意。至少做 my_data
你可以这样做:
as.data.frame(sapply(data, function(x) {gsub("Z", "", x)}))
您使用 gsub()
的方法不起作用,因为该函数对矢量而不是数据帧进行操作。但是,您可以 apply
gsub()
遍历数据框的每一列以获得您想要的内容:
df[] <- lapply(df, function (x) {gsub("Z", "", x)})
对于 stringr
解决方案(也使用 dplyr
),尝试:
library(tidyverse)
df <- mutate_all(df,
funs(str_replace_all(., "Z", "")))
P.S。我建议以后使用 df <-
而不是 df =
。祝你好运!
编辑:更正错字 - 感谢@thelatemail
您询问了如何在 stringr(/stringi) 包中执行此操作,以避免获得不需要的索引向量:
> as.data.frame(apply(df, 2,
function(col) stringr::str_replace_all(col, '^Z', '')))
> as.data.frame(apply(df, 2,
function(col) stringi::stri_replace_first_regex(col, '^Z', '')))
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
(需要调用 as.data.frame()
将输出数组转回 df R: apply-like function that returns a data frame?
)
至于弄清楚如何在整个数据帧上调用 str*_replace
函数,我试过...
- 整个df:
stri_replace_first_fixed(df, '^Z', '')
- 按行:
stri_replace_first_fixed(df[1,], '^Z', '')
- 按列:
stri_replace_first_fixed(df[,1], '^Z', '')
只有最后一个可以正常使用。不可否认 str*_replace
上的设计缺陷,它们至少应该识别无效对象并产生有用的错误消息,而不是喷出索引。
R 的新用户所以请放轻松。
我有这样的数据框:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
实际文件要大得多并且是从旧硬件输出的。由于某些原因,一些条目前面有 "Z"。如何从整个数据集中删除?
我试过 df = gsub("Z", " ", df)
但它让我胡说八道。这该死的东西!
[1] "1:3" "c(3, 1, 2)" "c(1, 1, 2)" "c(2, 3, 1)"
在 Whosebug 上查看并尝试了 stringr 包,但也无法开始工作。有人知道该怎么办吗?
您可以按以下方式使用简单的 ^Z
正则表达式:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
df[] <- lapply(df, sub, pattern = '^Z', replacement ="")
> df
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
^Z
模式用^
锚点匹配字符串的开头,然后Z
使用sub
匹配和删除(因为只有一种可能在每个字符串中匹配使用 gsub
).
你很接近。如果你想使用 base gsub
data$Mineral = gsub("Z", "", data$Mineral)
您可以对所有列执行此操作。或者结合使用 apply
策略(参见其他答案!)
PS。将数据命名为 data
不是一个好主意。至少做 my_data
你可以这样做:
as.data.frame(sapply(data, function(x) {gsub("Z", "", x)}))
您使用 gsub()
的方法不起作用,因为该函数对矢量而不是数据帧进行操作。但是,您可以 apply
gsub()
遍历数据框的每一列以获得您想要的内容:
df[] <- lapply(df, function (x) {gsub("Z", "", x)})
对于 stringr
解决方案(也使用 dplyr
),尝试:
library(tidyverse)
df <- mutate_all(df,
funs(str_replace_all(., "Z", "")))
P.S。我建议以后使用 df <-
而不是 df =
。祝你好运!
编辑:更正错字 - 感谢@thelatemail
您询问了如何在 stringr(/stringi) 包中执行此操作,以避免获得不需要的索引向量:
> as.data.frame(apply(df, 2,
function(col) stringr::str_replace_all(col, '^Z', '')))
> as.data.frame(apply(df, 2,
function(col) stringi::stri_replace_first_regex(col, '^Z', '')))
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
(需要调用 as.data.frame()
将输出数组转回 df R: apply-like function that returns a data frame?
)
至于弄清楚如何在整个数据帧上调用 str*_replace
函数,我试过...
- 整个df:
stri_replace_first_fixed(df, '^Z', '')
- 按行:
stri_replace_first_fixed(df[1,], '^Z', '')
- 按列:
stri_replace_first_fixed(df[,1], '^Z', '')
只有最后一个可以正常使用。不可否认 str*_replace
上的设计缺陷,它们至少应该识别无效对象并产生有用的错误消息,而不是喷出索引。